//package com.influxdb.demo.conf;
//
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.collections.CollectionUtils;
//import org.influxdb.InfluxDB;
//import org.influxdb.InfluxDBFactory;
//import org.influxdb.dto.Query;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.util.StringUtils;
//
//import java.util.Iterator;
//import java.util.Vector;
//
//@Data
//@Slf4j
//public class InfluxDBConnectPool {
//
//    private int maxConnection = 11; // 最大连接数
//    private int initialConnections = 10; // 连接池初始大小
//    private int incrementalConnections = 5; // 连接池自动增加的大小
//    private Vector<InfluxDBExample> influxDBExampleVector = null; // 连接池集合
//    private String username;
//    private String password;
//    private String url;
//    private String database;
//    private String retentionPolicy; // 数据保存策略
//    private String retentionPolicyTime; // 数据保存策略中数据保存时间
//
//    public InfluxDBConnectPool(String username, String password, String url, String database) {
//        this.username = username;
//        this.password = password;
//        this.url = url;
//        this.database = database;
//    }
//
//    /**
//     * 创建InfluxDB连接池
//     */
//    public synchronized void createInfluxDBPool() {
//        if (CollectionUtils.isNotEmpty(influxDBExampleVector))
//            return;
//        // 创建InFluxDB连接实列
//        influxDBExampleVector = new Vector<>();
//        try {
//            for (int i = 0; i < this.initialConnections; i++) {
//                InfluxDB influxDB = createInfluxDB();
//                InfluxDBExample influxDBExample = new InfluxDBExample(influxDB);
//                influxDBExample.setExtra(false);
//                influxDBExampleVector.add(influxDBExample);
//            }
//        } catch (Exception exception) {
//            exception.printStackTrace();
//        }
//    }
//
//    /**
//     * 创建InfluxDB连接实例
//     *
//     * @return
//     */
//    private InfluxDB createInfluxDB() {
//        InfluxDB influxDB = InfluxDBFactory.connect(url, username, password);
//        // 未有该数据库则创建
//        influxDB.query(new Query("CREATE DATABASE " + database));
//        influxDB.setDatabase(database);
//        return influxDB;
//    }
//
//    /**
//     * 获取InfluxDB连接实列
//     *
//     * @return
//     */
//    public synchronized InfluxDB getInfluxDB() {
//        if (CollectionUtils.isEmpty(influxDBExampleVector)) {
//            log.info("连接池未创建,无法获取连接");
//            return null;
//        }
//        InfluxDB usableInfluxDB = getUsableInfluxDB();
//        if (usableInfluxDB == null) {
//            // 无可用的连接
//            // 连接数达到上线等待别人释放连接后获取
//            // 在连接数未达到上线的情况下, 创建新的连接
//            if (influxDBExampleVector.size() > this.maxConnection) {
//                log.info("连接数已经达到最大, 请等待5秒再尝试获取连接");
//                try {
//                    Thread.sleep(5000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            } else {
//                log.info("连接数扩容");
//                try {
//                    for (int i = 0; i < incrementalConnections; i++) {
//                        if (influxDBExampleVector.size() < this.maxConnection) {
//                            InfluxDB influxDB = createInfluxDB();
//                            InfluxDBExample influxDBExample = new InfluxDBExample(influxDB);
//                            influxDBExample.setExtra(true);
//                            influxDBExampleVector.add(influxDBExample);
//                        } else {
//                            break;
//                        }
//                    }
//                } catch (Exception exception) {
//                    exception.printStackTrace();
//                }
//            }
//        }
//        return usableInfluxDB;
//    }
//
//    /**
//     * InfluxDB连接实例回收
//     */
//    public void recycleFluxDB(InfluxDB influxDB) {
//        if (CollectionUtils.isEmpty(influxDBExampleVector)) {
//            log.info("InfluxDB连接池未创建, 无法回收连接");
//            for (InfluxDBExample influxDBExample : influxDBExampleVector) {
//                if (influxDB == influxDBExample.getInfluxDB()) {
//                    influxDBExample.setBusy(true);
//                    break;
//                }
//            }
//        }
//    }
//
//    /**
//     * 刷新连接池, 处理掉额外创建的连接, 恢复初始连接数
//     */
//    public synchronized void freshFluxDBPool() {
//        if (CollectionUtils.isEmpty(influxDBExampleVector)) {
//            log.info("InfluxDB连接池未创建, 无法刷新");
//            Iterator<InfluxDBExample> influxDBExampleIterator = influxDBExampleVector.iterator();
//            while (influxDBExampleIterator.hasNext()) {
//                InfluxDBExample influxDBExample = influxDBExampleIterator.next();
//                if (!influxDBExample.isBusy()) { // 当前连接在使用中
//                    try {
//                        Thread.sleep(5000); // 等待5秒
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                }
//                // 额外创建的连接则销毁
//                if (influxDBExample.isExtra()) {
//                    closeInfluxDB(influxDBExample.getInfluxDB());
//                    influxDBExampleIterator.remove();
//                } else {
//                    // 是初始连接则将该连接设置为可用
//                    influxDBExample.setBusy(true);
//                }
//            }
//        }
//    }
//
//    /**
//     * 关闭InfluxDB连接池
//     */
//    public synchronized void closeInfluxDBPool() {
//        if (CollectionUtils.isEmpty(influxDBExampleVector)) {
//            log.info("InfluxDB连接池不存在无法关闭");
//            return;
//        }
//        Iterator<InfluxDBExample> influxDBExampleIterator = influxDBExampleVector.iterator();
//        while (influxDBExampleIterator.hasNext()) {
//            InfluxDBExample influxDBExample = influxDBExampleIterator.next();
//            if (influxDBExample.isBusy()) { // 连接为false不可用
//                try {
//                    Thread.sleep(5000); // 等待5秒
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                closeInfluxDB(influxDBExample.getInfluxDB());
//                influxDBExampleIterator.remove();
//            }
//            // 设置为null让垃圾回收期回收
//            influxDBExampleVector = null;
//            System.gc();
//        }
//    }
//
//    /**
//     * InfluxDB连接关闭
//     *
//     * @param influxDB
//     */
//    public void closeInfluxDB(InfluxDB influxDB) {
//        influxDB.close();
//    }
//
//    /**
//     * 获取可用的连接
//     *
//     * @return
//     */
//    public InfluxDB getUsableInfluxDB() {
//        InfluxDBExample influxDBExample = influxDBExampleVector.stream().filter(example ->
//                example.getInfluxDB().ping().isGood()).findFirst().orElse(null);
//        if (influxDBExample == null) {
//            log.info("无可用的连接");
//            return null;
//        } else {
//            influxDBExample.setBusy(false);
//            return influxDBExample.getInfluxDB();
//        }
//    }
//
//
//}
